home *** CD-ROM | disk | FTP | other *** search
-
- /********************************************************************/
- /* SOURCE CODE FILE */
- /********************************************************************/
- /*
- * >>> File name: 6.2 GroupObject.c
- *
- * >>> Purpose: Methods for Group Object
- * >>> Project: ObDraw Version 1
- * >>> Date: 2/20/89
- * >>> By: Adam Treister
- *
- */
- /********************************************************************/
- /* For Your Information 1802 Hillside Rd. SB CA 93101 */
- /********************************************************************/
-
- #include "PoopDrawInc"
-
- /***** Object Type Defs *********************************************/
- typedef struct
- {
- _StdObjectFields
- ObjectHandle list;
- } GroupRec,*GroupPtr,**GroupHandle;
-
- /***** Public Functions *********************************************/
-
- GroupHandle NewGroup(void);
-
- /***** Private Functions ********************************************/
-
- private void ObjDispatch(GroupHandle ObjectH,int Message,LPtr ParmP);
- private void Dispose(GroupHandle ObjectH);
- private void Ungroup(GroupHandle ObjectH);
- private void Draw(GroupHandle ObjectH);
- private void AddObjToGroup(GroupHandle ObjectH,ObjectHandle ParmP);
- private void Move(GroupHandle ObjectH,LPtr ParmP);
- private void Pack(GroupHandle ObjectH,Handle h);
- private void UnPack(GroupHandle ObjectH,Ptr *pP);
- private void SetLength(GroupHandle ObjectH);
-
- /********************************************************************/
-
- void ObjDispatch(ObjectH,Message,ParmP)
- GroupHandle ObjectH;
- int Message;
- LPtr ParmP;
- {
- switch(Message)
- {
- case DISPOSE: Dispose(ObjectH); break;
- case ADDOBJECT: AddObjToGroup(ObjectH,(ObjectHandle) ParmP); break;
- case DRAW: Draw(ObjectH); break;
- case MOVE: Move(ObjectH,ParmP); break;
- case UNGROUP: Ungroup(ObjectH); break;
-
- case SELECT: BitSet(&(*ObjectH)->attributes,SelectedBit);
- Dispatch(ObjectH,INVAL,NULL); break;
- case UNSELECT: BitClr(&(*ObjectH)->attributes,SelectedBit);
- Dispatch(ObjectH,INVAL,NULL); break;
-
- case FRAME:
- case FILL:
- case PENPAT: /* These Message are sent to all objects in the group */
- case PENSIZE: Dispatch((*ObjectH)->list,Message,ParmP); break;
-
- case SETLEN: SetLength(ObjectH); break;
- case PACK: Pack(ObjectH,ParmP); break;
- case UNPACK: UnPack(ObjectH,ParmP); break;
-
- default: DrawObjectDispatch(ObjectH,Message,ParmP);
- }
- }
- /*-------------------------------------------NEW-----------------*/
- /*
- * Function: -- NewGroupObj
- *
- * Date: -- Feb. 20, 1989
- * ObDraw Version 1 -- Copyright FYI,1989 -- Adam Treister
- /*---------------------------------------------------------------*/
-
- GroupHandle NewGroup()
- {
- GroupHandle ObjectH;
-
- ObjectH = _GetHandleToRecord(GroupRec);
- NullOutHandle(ObjectH);
- New(LIST,NULL,&(*ObjectH)->list);
- SetRect(&(*ObjectH)->bounds,0,0,0,0);
- BitSet(&(*ObjectH)->attributes,VisibleBit);
- (*ObjectH)->port = MyFrontWindow();
- (*ObjectH)->dispatch = ObjDispatch;
- (*ObjectH)->class = GROUP;
-
- Dispatch(ObjectH,INVAL,NULL);
- return(ObjectH);
- }
- /*------------------------------------------------------------------*/
-
- void Dispose(ObjectH)
- GroupHandle ObjectH;
- {
- long KillItAll = 3;
- Dispatch(SELF,INVAL,NULL);
- WDispatch((*ObjectH)->port,DELOBJECT,SELF);
- Dispatch((*ObjectH)->list,DISPOSE,&KillItAll);
- DisposeHandle(ObjectH);
- }
- /*------------------------------------------------------------------*/
-
- void AddObjToGroup(ObjectH,newObj)
- GroupHandle ObjectH;
- ObjectHandle newObj;
- {
- if (Width((*ObjectH)->bounds))
- UnionRect(&(*ObjectH)->bounds,&(*newObj)->bounds,&(*ObjectH)->bounds);
- else (*ObjectH)->bounds = (*newObj)->bounds;
- Dispatch((*ObjectH)->list,ADDOBJECT,newObj);
- }
- /*------------------------------------------------------------------*/
-
- void Ungroup(ObjectH)
- GroupHandle ObjectH;
- {
- WindowPtr wP;
- int i;
- long nElems;
- ObjectHandle obj;
-
- wP = MyFrontWindow();
- Dispatch((*ObjectH)->list,GETSIZE,&nElems);
- for (i = 0; i < nElems; i++)
- {
- Dispatch((*ObjectH)->list,NEXT,&obj);
- Dispatch((*ObjectH)->list,DELOBJECT,obj);
- WDispatch(wP,ADDOBJECT,obj);
- }
- WDispatch(wP,UNSELECT,SELF);
- WDispatch(wP,DELOBJECT,SELF);
- Dispose(ObjectH);
- }
-
- /*-------------------------------------------method--------------*/
- /*
- * Function: -- GroupDraw
- *
- * Date: -- Feb. 20, 1989
- * ObDraw Version 1 -- Copyright FYI,1989 -- Adam Treister
- /*---------------------------------------------------------------*/
-
- void Draw(ObjectH)
- GroupHandle ObjectH;
- {
- if (BitTst(&(*ObjectH)->attributes,VisibleBit))
- {
- /* EraseRect(&(*ObjectH)->bounds);
- */
- Dispatch((*ObjectH)->list,DRAW,NULL);
- if (BitTst(&(*ObjectH)->attributes,SelectedBit))
- {
- PenPat(gray);
- PenSize(2,2);
- FrameRect(&(*ObjectH)->bounds);
- }
- } }
- /*------------------------------------------------------------------*/
-
- void Move(ObjectH,inP)
- GroupHandle ObjectH;
- LPtr inP;
- {
- Point *ptP;
-
- Rect r;
- r = (*ObjectH)->bounds;
- InsetRect(&r,-2,-2);
- EraseRect(&r);
- InvalRect(&r);
- ptP = (Point *) inP;
- Dispatch((*ObjectH)->list,MOVE,inP);
- OffsetRect(&(*ObjectH)->bounds,ptP->h,ptP->v);
- InvalRect(&(*ObjectH)->bounds);
-
- }
- /*------------------------------------------------------------------*/
-
- void SetLength(ObjectH)
- GroupHandle ObjectH;
- {
- long len;
-
- Dispatch((*ObjectH)->list,GETSIZE,&len);
- (*ObjectH)->length = len;
- }
- /*------------------------------------------------------------------*/
- #define SKIP2FLDS 8L
- void Pack(ObjectH,h)
- GroupHandle ObjectH;
- Handle h;
- {
- Size size;
- Ptr p;
- long nBytes;
- Rect r;
-
- nBytes = _lsizeof(ObjectRec) - SKIP2FLDS;
- size = GetHandleSize(h);
- SetHandleSize(h,size + nBytes); MEM_CHECK
-
- HLock(h);
- p = *h + size; /* move to end of existing handle */
- BlockMove(&(*ObjectH)->class,p,nBytes);
- HUnlock(h);
-
- Dispatch((*ObjectH)->list,SETLEN,h);
- Dispatch((*ObjectH)->list,PACK,h);
- }
- /*------------------------------------------------------------------*/
- void UnPack(ObjectH,pP)
- GroupHandle ObjectH;
- Ptr *pP;
- {
- Ptr p;
- int nObjects,i;
- long nBytes;
- Rect dummyRect;
- ObjectHandle NewObject;
- int class;
-
- nBytes = _lsizeof(ObjectRec) - SKIP2FLDS;
- p = *pP;
- BlockMove(p,&(*ObjectH)->class,nBytes);
- nObjects = (*ObjectH)->length;
- *pP += nBytes;
- SetRect(&dummyRect,0,0,1,1);
- for (i = 0; i < nObjects ; i++)
- {
- class = *(int *) (*pP);
- New(class,&dummyRect,&NewObject);
- Dispatch(NewObject,UNPACK,pP);
- Dispatch((*ObjectH)->list,ADDOBJECT,NewObject);
- }
-
- }
-
-